package de.fhluebeck.oop.gps.gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import org.jdesktop.swingx.JXMapKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import de.fhluebeck.oop.gps.map.MapManager;

/**
 * 
 * Beschreibung:<br>
 * MainGui der Anwendung.
 * 
 * @author Ogün Bilge, Leif Hitzschke
 * @version 1.00, 05.11.2009
 * 
 */
public class GpsView extends JFrame {

	private final static Logger log = LoggerFactory.getLogger(GpsView.class);

	private static int frameWeight = 1000;
	private static int frameHeight = 700;
	
	private GpsController controller = new GpsController(this);
	
	MapManager mapManager ;
	JComboBox kategorie;
	JTextField description;
	JTextArea descriptionPOI;
	JTextField LAT;
	JTextField LNG;
	JButton cmdCancel;
	JButton cmdSave;
	JTextField umkreis;
	
	public GpsView() {
		super("GPS-Nutzung");
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// //////////////////////////////////////////////////////////////////////////////////////////////////
		// Mappanel
		// - In diesem Panel wird die Map plaziert
		// //////////////////////////////////////////////////////////////////////////////////////////////////
		JPanel mapPanel = new JPanel();
		mapPanel.setLayout(new BorderLayout());

		JXMapKit map = new JXMapKit();
		map.setName("Map1");
		map.setDefaultProvider(org.jdesktop.swingx.JXMapKit.DefaultProviders.OpenStreetMaps);
		// Setzen der Startkarte und implementieren des Setzens von Wegpunkten
		mapManager = new MapManager(map);
		mapManager.setUp();
		mapManager.setWaypointUpdateListener(controller);
		mapManager.setWaypointCreateListener(controller);

		mapPanel.add(map, BorderLayout.CENTER);

		// //////////////////////////////////////////////////////////////////////////////////////////////////
		// Detailspanel
		// - In diesem Panel werden die POI angelegt
		// //////////////////////////////////////////////////////////////////////////////////////////////////
		
		JPanel editPanel = new JPanel();
		editPanel.setLayout(new BorderLayout());
		
		JLabel txtKategorie = new JLabel("Waehlen Sie die Kategorie:");
		JLabel txtPOI = new JLabel("Bezeichnung fuer POI:");
		JLabel txtDescriptionPOI = new JLabel("Beschreibung fuer POI:");
		JLabel txtLAT = new JLabel("Breitengrad:");
		JLabel txtLNG = new JLabel("Längengrad:");
		JLabel txtUmkreis = new JLabel("POI's im Umkreis von 1 km:");
		LAT = new JTextField("");
		LAT.setEditable(false);
		LNG = new JTextField("");
		LNG.setEditable(false);
		
		description = new JTextField();
		description.setDocument(new JTextFieldLimit(30));
		description.setEditable(false);
		descriptionPOI = new JTextArea(10, 1);
		descriptionPOI.setDocument(new JTextFieldLimit(4001));
		descriptionPOI.setLineWrap(true);
		descriptionPOI.setEditable(false);
		JScrollPane scrpDescriptionPOI = new JScrollPane();
		scrpDescriptionPOI.setViewportView(descriptionPOI);
		umkreis = new JTextField();
		umkreis.setEditable(false);
				
		FormLayout layout = new FormLayout("15dlu, 100dlu, 10dlu", // columns
				"4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu, pref, 4dlu" // rows
		);

		JPanel settingsPanel = new JPanel(layout);
		kategorie = new JComboBox();
		
		CellConstraints cc = new CellConstraints();
		settingsPanel.add(txtKategorie, cc.xy(2, 2));
		settingsPanel.add(kategorie, cc.xy(2, 4)); // Spalte, Zeile
		settingsPanel.add(txtPOI, cc.xy(2, 6));
		settingsPanel.add(description, cc.xy(2, 8));
		settingsPanel.add(txtDescriptionPOI, cc.xy(2, 10));
		settingsPanel.add(scrpDescriptionPOI, cc.xy(2, 12));
		
		settingsPanel.add(txtLAT, cc.xy(2, 14));
		settingsPanel.add(LAT, cc.xy(2, 16));
		settingsPanel.add(txtLNG, cc.xy(2, 18));
		settingsPanel.add(LNG, cc.xy(2, 20));
		settingsPanel.add(txtUmkreis, cc.xy(2, 22));
		settingsPanel.add(umkreis, cc.xy(2, 24));


		// //////////////////////////////////////////////////////////////////////////////////////////////////

		// //////////////////////////////////////////////////////////////////////////////////////////////////
		// Buttonpanel
		// - In diesem Panel sind die Buttons für die Aktionen plaziert
		// //////////////////////////////////////////////////////////////////////////////////////////////////
		JPanel buttonPanel = new JPanel();
		buttonPanel.setBorder(new EmptyBorder(0, 0, 5, 5));
		buttonPanel.setLayout(new BorderLayout());
		cmdCancel = new JButton("  Abbrechen   ");
		cmdCancel.setActionCommand("cmdCancel");
		cmdCancel.addActionListener(controller);

		cmdSave = new JButton("Speichern");
		cmdSave.setActionCommand("cmdSave");
		cmdSave.addActionListener(controller);
		
		ButtonBarBuilder builder = new ButtonBarBuilder();
		builder.addGridded(cmdCancel);
		builder.addUnrelatedGap();
		builder.addGridded(cmdSave);
	
		buttonPanel.add(builder.getPanel(), BorderLayout.EAST);
		// //////////////////////////////////////////////////////////////////////////////////////////////////

		// //////////////////////////////////////////////////////////////////////////////////////////////////
		// - Menue aufbauen
		// //////////////////////////////////////////////////////////////////////////////////////////////////
		JMenuBar menubar = new JMenuBar();
		JMenu file = new JMenu("Datei");
		file.setMnemonic(KeyEvent.VK_D);
		JMenuItem cmdClose = new JMenuItem("Schliessen");
		cmdClose.setMnemonic(KeyEvent.VK_S);
		cmdClose.setActionCommand("cmdClose");
		cmdClose.addActionListener(controller);

		JMenu stammdaten = new JMenu("Stammdaten");
		stammdaten.setMnemonic(KeyEvent.VK_S);
		JMenuItem cmdKategorie = new JMenuItem("Kategorien");
		cmdKategorie.setMnemonic(KeyEvent.VK_K);
		cmdKategorie.setActionCommand("cmdKategorie");
		cmdKategorie.addActionListener(controller);

		JMenu extras = new JMenu("Extras");
		extras.setMnemonic(KeyEvent.VK_E);
		JMenuItem cmdAbout = new JMenuItem("Ueber GPSNutzung");
		cmdAbout.setMnemonic(KeyEvent.VK_U);
		cmdAbout.setActionCommand("cmdAbout");
		cmdAbout.addActionListener(controller);

		file.add(cmdClose);
		stammdaten.add(cmdKategorie);
		extras.add(cmdAbout);

		menubar.add(file);
		menubar.add(stammdaten);
		menubar.add(extras);
		// //////////////////////////////////////////////////////////////////////////////////////////////////

		// //////////////////////////////////////////////////////////////////////////////////////////////////
		// - Panels und Menü auf Contentpane plazieren
		// //////////////////////////////////////////////////////////////////////////////////////////////////
		setJMenuBar(menubar);

		editPanel.add(settingsPanel, BorderLayout.CENTER);
		editPanel.add(buttonPanel, BorderLayout.SOUTH);

		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(mapPanel, BorderLayout.CENTER);
		getContentPane().add(editPanel, BorderLayout.EAST);

		setSize(frameWeight, frameHeight);
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation((screen.width - getSize().width) / 2,
				(screen.height - getSize().height) / 2);
		controller.initializeFields();
		
		setVisible(true);

		// //////////////////////////////////////////////////////////////////////////////////////////////////
	}

}
